package com.knight.websocket;

import io.netty.channel.*;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

public class WSServerInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {

        ChannelPipeline pipeline = ch.pipeline();

        // websocket 基于HTTP协议，所以要有HTTP编解码器
        pipeline.addLast("HttpServerCodec", new HttpServerCodec());

        // 对写大数据流的支持
        pipeline.addLast("ChunkedWriteHandler", new ChunkedWriteHandler());

        // 对HttpMessage进行聚合，聚合成FullHttpRequest或者FullHttpResponse
        // 几乎在Netty中的编程，都会用到此Handler
        pipeline.addLast("HttpObjectAggregator", new HttpObjectAggregator(1024 * 64));

        // =====================以上是用于支持Http协议========================


        /*
         * WebSocket服务器处理的协议，用于指定给客户端连接访问的路由
         * 本Handler能够处理一些繁重复杂的事情
         * 例如：处理握手工作(handshaking:close, ping, pong)
         * 对于webSocket来说，都是以frames进行传输的，不同的数据类型对应的frames也不同
         */
        pipeline.addLast("WebSocketServerHandler", new WebSocketServerProtocolHandler("/ws"));


        // 自定义Handler
        // 对客户端传来的消息进行相应的处理，然后发送消息到客户端
        pipeline.addLast("ChatHandler", new ChatHandler());

    }
}
